/* function add(a,b){
    return a+b;
}
console.log(add(1,2))
//add(1)(2)
function curriedAdd(a){
  return function(b){
    return a+b;
  }
}
//applyMiddleware(logger)(createStore)(reducer)
//react-redux connect(mapStateToProps,mapDispatchToProps)(Counter)
let result = curriedAdd(1)(2);
console.log(result) */

//判断某个值是不是某种类型
/* function isType(type,val){
    const typeName =  Object.prototype.toString.call(val).slice(8,-1);
    return typeName === type;
} */
/* function isType(type){
    return function(val){
        return type=Object.prototype.toString.call(val).slice(8,-1);;
    }
}
//1.参数重用，通过固定一部分参数，可以创建接受少量参数的新函数
const isStringType = isType('String');
console.log(isStringType('hello'))
console.log(isStringType('world')) */

//延迟计算
/* function sum(a,b,c){
    return a+b+c;
}
function curriedSum(a){
    return function(b){
        return function(c){
            return a+b+c;
        }
    }
} */

function sum(a,b,c){
    return a+b+c;
}
//把一个普通的接收多个参数的函数变成多个可以接受一个参数的函数或者多个
function curry(fn){
    return function curried(...args){
        //如果说本次传递的参数数量和函数形参数量一样，说明参数数量已经足够，就可以执行原始的函数
        if(args.length>=fn.length){
            return fn.apply(this,args);
        }else{
            //如果数量不够，则返回一个接收参数的新函数
            return function(...args2){
                return curried.apply(this,[...args,...args2]);
            }
        }
    }
}
//console.log(curried(1)(2)(3));

const curried = curry(sum);
console.log(curried(1,2,3));
console.log(curried(1)(2)(3));
console.log(curried(1,2)(3));
console.log(curried(1,2)(3,4));
console.log(curried(1)(2,3));